<!--
  * JOB 表单
-->
<template>
  <div>
    <!-- 编辑 -->
    <a-modal :open="updateModalShow" :width="650" :title="isAdd ? '添加' : '编辑'" ok-text="确认" cancel-text="取消"
      @cancel="closeUpdateModal" @ok="confirmUpdateJob">
      <a-form ref="updateFormRef" :model="updateForm" :rules="updateRules" :label-col="{ span: 4 }">
        <a-form-item label="任务名称" name="jobName">
          <a-input placeholder="请输入任务名称" v-model:value="updateForm.jobName" :maxlength="100" :showCount="true" />
        </a-form-item>
        <a-form-item label="任务描述" name="remark">
          <a-textarea :auto-size="{ minRows: 2, maxRows: 4 }" v-model:value="updateForm.remark"
            placeholder="(可选)请输入任务备注描述" :maxlength="250" :showCount="true" />
        </a-form-item>
        <a-form-item label="排序" name="sort">
          <a-input-number v-model:value="updateForm.sort" :min="-99999999" :max="99999999" :precision="0"
            style="width: 100%" placeholder="值越小越靠前">
          </a-input-number>
        </a-form-item>
        <a-form-item label="执行类" name="jobClass">
          <a-textarea :auto-size="{ minRows: 2, maxRows: 4 }" v-model:value="updateForm.jobClass"
            placeholder="示例：net.lab1024.sa.base.module.support.job.sample.SmartJobSample1" :maxlength="200"
            :showCount="true" />
        </a-form-item>
        <a-form-item label="任务参数" name="param">
          <a-textarea :auto-size="{ minRows: 3, maxRows: 6 }" v-model:value="updateForm.param"
            placeholder="(可选)请输入任务执行参数" :maxlength="1000" :showCount="true" />
        </a-form-item>
        <a-form-item label="触发类型" name="triggerType">
          <a-radio-group v-model:value="updateForm.triggerType">
            <a-radio-button :value="TRIGGER_TYPE_ENUM.CRON.value">CRON表达式</a-radio-button>
            <a-radio-button :value="TRIGGER_TYPE_ENUM.FIXED_DELAY.value">固定间隔</a-radio-button>
          </a-radio-group>
        </a-form-item>
        <a-form-item label="触发时间" name="triggerTime">
          <a-input v-if="updateForm.triggerType === TRIGGER_TYPE_ENUM.CRON.value" placeholder="示例：10 15 0/1 * * *"
            v-model:value="updateForm.cron" :maxlength="100" :showCount="true" />
          <a-input-number v-else-if="updateForm.triggerType === TRIGGER_TYPE_ENUM.FIXED_DELAY.value"
            v-model:value="updateForm.fixedDelay" :min="1" :max="100000000" :precision="0">
            <template #addonBefore>每隔</template>
            <template #addonAfter>秒</template>
          </a-input-number>
        </a-form-item>
        <a-form-item label="是否开启" name="enabledFlag">
          <a-switch v-model:checked="updateForm.enabledFlag" />
        </a-form-item>
      </a-form>
    </a-modal>

    <!-- 立即执行 -->
    <a-modal :open="executeModalShow" :width="650" title="执行任务" ok-text="执行" cancel-text="取消"
      @cancel="closeExecuteModal" @ok="confirmExecuteJob">
      <br />
      <a-alert type="info" show-icon style="margin-left: 25px">
        <template #message> 点击【执行】后会按照【任务参数】，无论任务是否开启，都会立即执行。 </template>
      </a-alert>
      <br />
      <a-form :label-col="{ span: 4 }">
        <a-form-item label="任务名称" name="jobName">
          <a-input v-model:value="executeForm.jobName" :disabled="true" />
        </a-form-item>
        <a-form-item label="任务类名" name="jobClass">
          <a-textarea :auto-size="{ minRows: 2, maxRows: 4 }" v-model:value="executeForm.jobClass" :disabled="true" />
        </a-form-item>
        <a-form-item label="任务参数" name="param">
          <a-textarea :auto-size="{ minRows: 3, maxRows: 6 }" v-model:value="executeForm.param"
            placeholder="(可选)请输入任务执行参数" :maxlength="1000" :showCount="true" />
        </a-form-item>
      </a-form>
    </a-modal>
  </div>
</template>
<script setup lang="ts">
import { message } from 'ant-design-vue';
import { reactive, ref } from 'vue';
import { jobApi } from '/@/api/kernel/job-api';
import { smartSentry } from '/@/lib/smart-sentry';
import { SmartLoading } from '/@/components/framework/smart-loading/index.js';
import { TRIGGER_TYPE_ENUM } from '/@/constants/support/job-const.js';

// emit
const emit = defineEmits(['reloadList']);

const isAdd = ref(false);
const updateModalShow = ref(false);
const updateFormRef = ref();

const updateFormDefault = {
  jobId: null,
  jobName: '',
  jobClass: '',
  triggerType: TRIGGER_TYPE_ENUM.CRON.value,
  triggerValue: null,
  cron: '',
  fixedDelay: null,
  param: '',
  enabledFlag: false,
  remark: '',
  sort: null,
};
let updateForm = reactive({ ...updateFormDefault });
const updateRules = {
  jobName: [{ required: true, message: '请输入任务名称' }],
  jobClass: [{ required: true, message: '请输入执行类' }],
  triggerType: [{ required: true, message: '请选择触发类型' }],
  sort: [{ required: true, message: '请输入排序' }],
};

// 打开编辑弹框
function openUpdateModal(record) {
  isAdd.value = null == record;
  // 更新
  if (!isAdd.value) {
    Object.assign(updateForm, record);
    if (TRIGGER_TYPE_ENUM.CRON.value === record.triggerType) {
      updateForm.cron = record.triggerValue;
    }
    if (TRIGGER_TYPE_ENUM.FIXED_DELAY.value === record.triggerType) {
      updateForm.fixedDelay = record.triggerValue;
    }
  }
  updateModalShow.value = true;
}

// 关闭编辑弹框
function closeUpdateModal() {
  Object.assign(updateForm, updateFormDefault);
  updateModalShow.value = false;
}

// 确认更新
async function confirmUpdateJob() {
  updateFormRef.value
    .validate()
    .then(async () => {

      if (TRIGGER_TYPE_ENUM.CRON.value === updateForm.triggerType) {
        updateForm.triggerValue = updateForm.cron;
      }
      if (TRIGGER_TYPE_ENUM.FIXED_DELAY.value === updateForm.triggerType) {
        updateForm.triggerValue = updateForm.fixedDelay;
      }

      if (!updateForm.triggerValue) {
        message.error('请填写 触发时间');
        return;
      }

      try {
        SmartLoading.show();
        if (isAdd.value) {
          await jobApi.addJob(updateForm)
          message.success('添加成功');
        } else {
          await jobApi.updateJob(updateForm);
          message.success('更新成功');
        }
        closeUpdateModal();
        emit('reloadList');
      } catch (error) {
        smartSentry.captureError(error);
      } finally {
        SmartLoading.hide();
      }
    })
    .catch((error) => {
      console.log('error', error);
      message.error('参数验证错误，请检查表单数据');
    });
}

// ------------------------------------ 执行任务 -------------------------------------
const executeModalShow = ref(false);
const executeFormDefault = {
  jobId: null,
  jobName: '',
  jobClass: '',
  param: null,
};
let executeForm = reactive({ ...executeFormDefault });

// 打开执行弹框
function openExecuteModal(record) {
  Object.assign(executeForm, record);
  executeModalShow.value = true;
}

// 关闭执行弹框
function closeExecuteModal() {
  Object.assign(executeForm, executeFormDefault);
  executeModalShow.value = false;
}

// 确认执行
async function confirmExecuteJob() {
  try {
    let executeParam = {
      jobId: executeForm.jobId,
      param: executeForm.param,
    };
    await jobApi.executeJob(executeParam);
    // loading 延迟后再提示刷新
    SmartLoading.show();
    await new Promise((resolve) => setTimeout(resolve, 2000));
    message.success('执行成功');
    closeExecuteModal();
    emit('reloadList');
  } catch (e) {
    smartSentry.captureError(e);
  } finally {
    SmartLoading.hide();
  }
}

defineExpose({
  openUpdateModal,
  openExecuteModal,
});
</script>
